perm filename PUP[1,DBL]1 blob sn#052974 filedate 1973-07-11 generic text, type T, neo UTF8
  (PROGN (LISPXPRIN1 (QUOTE "FILE CREATED ")
                     T)
         (LISPXPRIN1 (QUOTE " 8-JUN-73  1:05:10")
                     T)
         (LISPXTERPRI T))
  (LISPXPRINT (QUOTE PUPVARS)
              T)
  [RPAQQ PUPVARS
         (NEED REQUIRE W $PGM $UNUSEDVARS
               (FNS RAMIFICATIONS REV2ELS CELLEQUAL LISTEQUAL 
                    REPLACECDR REPLACECAR MAKENULL RPLAC NEWCELL 
                    STORECVALUE CONSC SETQC TRANSITIVECLOSURE 
                    TRYANYTHINGANTISYMPARTIAL SIMPLEGOAL SOLVE SETUP 
                    INIT GETNEWLOCNAME DENYALL SERIESGOAL ORGOAL 
                    ANDGOAL XORGOAL BUILDPGM)
               (P (QSETUP PUPVARS]
  (RPAQQ NEED NIL)
  (RPAQQ REQUIRE NIL)
  (RPAQQ W
         (FNS RAMIFICATIONS REV2ELS CELLEQUAL LISTEQUAL REPLACECDR 
              REPLACECAR MAKENULL RPLAC NEWCELL STORECVALUE CONSC SETQC 
              TRANSITIVECLOSURE TRYANYTHINGANTISYMPARTIAL SIMPLEGOAL 
              SOLVE SETUP INIT GETNEWLOCNAME DENYALL SERIESGOAL ORGOAL 
              ANDGOAL XORGOAL BUILDPGM))
  (RPAQQ $PGM (TUPLE))
  (RPAQQ $UNUSEDVARS
         (CLASS U5 U4 U3 U2 U6 U7 U8 U9 U10 U11 U12 U13 U14 U15 U16 U17 
                U1))
(DEFINEQ

(RAMIFICATIONS
  [QLAMBDA
    (TUPLE ←A
           ←B)
    (QPROG (←L
             ←NEXT
             ←S1
             ←S2
             ←S3)
           (QMATCHQ ←L
                    (QINSTANCES ←←ANY))
           B1
           (QATTEMPT (QMATCHQ (CLASS ←NEXT
                                     ←←L)
                              $L)
             ELSE (QRETURN TRUE))
           B2
           [QATTEMPT (QMATCHQ (TUPLE ←←S1
                                     $A ←←S2
                                     $B ←←S3)
                              $NEXT)
               THEN (QPROG NIL (QDELETE (TUPLE $$S1 $A $$S2 $B $$S3))
                           (QASSERT (TUPLE $$S1 $B $$S2 $A $$S3))
                           (GOTO B3))
             ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                            $B ←←S2
                                            $A ←←S3)
                                     $NEXT)
                      THEN (QPROG NIL
                                  (QDELETE (TUPLE $$S1 $B $$S2 $A $$S3))
                                  (QASSERT (TUPLE $$S1 $A $$S2 $B $$S3))
                                  (GOTO B3))
                    ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                                   $A ←←S2)
                                            $NEXT)
                             THEN (QPROG NIL
                                         (QDELETE (TUPLE $$S1 $A $$S2))
                                         (QASSERT (TUPLE $$S1 $B $$S2))
                                         (GOTO B3))
                           ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                                          $B ←←S2)
                                                   $NEXT)
                                    THEN (QPROG NIL
                                                (QDELETE (TUPLE $$S1 $B 
                                                               $$S2))
                                                (QASSERT (TUPLE $$S1 $A 
                                                               $$S2]
           B3
           (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                     (TUPLE ←←NEXT)←←S2)
                              $NEXT)
               THEN (GOTO B2)
             ELSE (GOTO B1])

(REV2ELS
  (QLAMBDA (TUPLE ←RELN
                  ←A
                  ←B)
           (QIF (QAND (QEQUAL (QGET $RELN PARTIAL)
                              TRUE)
                      (QEQUAL (QGET $RELN ANTISYM)
                              TRUE))
             ELSE (QFAIL))
           (QATTEMPT (QEXISTS (TUPLE $RELN $B $A))
             ELSE (TRANSITIVECLOSURE (TUPLE $RELN $B $A)))
           (QEXISTS (TUPLE C $A ←ACON))
           (QEXISTS (TUPLE C $B ←BCON))
           (QGOAL (TUPLE SERIES (TUPLE C $A $BCON)
                         (TUPLE C $B $ACON))
                  APPLY $GOALTYPE)))

(CELLEQUAL
  (QLAMBDA (CLASS ←A
                  ←B)
           (QAND (QATTEMPT (QEXISTS (TUPLE C $A ←VAL1)))
                 (QATTEMPT (QEXISTS (TUPLE C $B ←VAL2)))
                 (QEQUAL $VAL1 $VAL2))))

(LISTEQUAL
  [QLAMBDA (CLASS ←A
                  ←B)
           (QPROG (←E1
                    ←E2
                    ←E3
                    ←E4)
                  (QATTEMPT (QMATCHQ (TUPLE ←E1
                                            ←←E2)
                                     $A)
                      THEN (QMATCHQ (TUPLE ←E3
                                           ←←E4)
                                    $B)
                    ELSE (QATTEMPT (QMATCHQ (TUPLE ←E3
                                                   ←←E4)
                                            $B)
                             THEN (QRETURN FALSE)
                           ELSE (QRETURN TRUE)))
                  (QIF (QAND (CELLEQUAL (CLASS $E1 $E3))
                             (LISTEQUAL (CLASS $E2 $E4)))
                      THEN (QRETURN TRUE)
                    ELSE (QRETURN FALSE])

(REPLACECDR
  (QLAMBDA (TUPLE LIST ←L
                  ←NEWCDR
                  ←OLDCDR
                  ←CAR)
           (QDELETE (TUPLE LIST $L (TUPLE $CAR $$OLDCDR)))
           (QASSERT (TUPLE LIST $L (TUPLE $CAR $$NEWCDR)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE REPLACE CDR OF LIST $L 
                                  WHICH WAS $OLDCDR BY $NEWCDR)
                           (TUPLE RPLACD $NEWCDR $L)
                           $$PGM))))

(REPLACECAR
  (QLAMBDA (TUPLE LIST ←L
                  ←NEWCAR
                  ←OLDCAR
                  ←CDR)
           (QMATCHQ ←NEWLIST
                    (TUPLE $NEWCAR $$CDR))
           (QMATCHQ ←OLDLIST
                    (TUPLE $OLDCAR $$CDR))
           (QDELETE (TUPLE LIST $L $OLDLIST))
           (QASSERT (TUPLE LIST $L $NEWLIST))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE REPLACE CAR OF LIST $L 
                                  WHICH WAS $OLDCAR
                              BY THE CELL $NEWCAR)
                           (TUPLE RPLACA $NEWCAR $L)
                           $$PGM))))

(MAKENULL
  (QLAMBDA (TUPLE LIST ←L
                  (TUPLE))
           (QATTEMPT (QEXISTS (TUPLE LIST $L ←ANY))
               THEN (QDELETE (TUPLE LIST $L $ANY)))
           (QASSERT (TUPLE LIST $L (TUPLE)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE SET LIST $L TO NULL)
                           (TUPLE SETQ $L NIL)
                           $$PGM))))

(RPLAC
  [QLAMBDA (TUPLE LIST ←L
                  (TUPLE ←CAR
                         ←←CDR))
           (QEXISTS (TUPLE LIST $L (TUPLE ←←CURRENT)))
           (QMATCHQ (TUPLE ←CURCAR
                           ←←CURCDR)
                    $CURRENT)
           (QIF (LISTEQUAL (CLASS $CURCDR $CDR))
               THEN (REPLACECAR (TUPLE LIST $L $CAR $CURCAR $CDR))
             ELSE (QIF (CELLEQUAL (CLASS $CURCAR $CAR))
                      THEN (REPLACECDR (TUPLE LIST $L $CDR $CURCDR $CAR)
                                       )
                    ELSE (QFAIL])

(NEWCELL
  [QLAMBDA (TUPLE ←VAL
                  ←LOC)
           (QPROG (←AUXLOC)
                  (QMATCHQ (CLASS ←AUXLOC
                                  ←←UNUSEDVARS)
                           $UNUSEDVARS)
                  (QASSERT (TUPLE C $AUXLOC $VAL))
                  (QMATCHQ ←PGM
                           (TUPLE (TUPLE COMMENT I MAY NEED $VAL LATER 
                                         SO BEFORE I STORE SOMETHING
                                     IN LOCATION $LOC I AM TRANSFERRING 
                                        $VAL
                                     TO THE NEWLY CREATED LOCATION 
                                        $AUXLOC)
                                  (TUPLE SETQ $AUXLOC $LOC)
                                  $$PGM])

(STORECVALUE
  [QLAMBDA ←LOC
           (QPROG (←VALU
                    ←RESERVE)
                  (QATTEMPT (QEXISTS (TUPLE C $LOC ←VALU))
                      THEN (QATTEMPT (QBEXISTS
                                       (TUPLE C ←RESERVE
                                              $VALU)
                                         THEN (QIF (QEQUAL $RESERVE 
                                                           $LOC)
                                                  THEN (QFAIL)
                                                ELSE (QPUT
                                                       (TUPLE C 
                                                           $RESERVE 
                                                              $VALU)
                                                       NEEDED TRUE)))
                             ELSE (NEWCELL (TUPLE $VALU $LOC)))
                    ELSE (QRETURN TRUE])

(CONSC
  [QLAMBDA
    (TUPLE LIST ←L
           (TUPLE ←CAR
                  ←←CDR))
    (QPROG (←M
             ←S1
             ←S2)
           (QATTEMPT (QGOAL (TUPLE LIST $L $CDR)
                            APPLY $GOALTYPE)
               THEN (QATTEMPT (QEXISTS (TUPLE LIST ←M
                                              (TUPLE ←←S1
                                                     $CAR ←←S2)))
                        THEN [QPROG (←M2
                                      ←T)
                                    (QMATCHQ ←T
                                             (GETNEWLOCNAME))
                                    (QDELETE (TUPLE LIST $L $CDR))
                                    (QMATCHQ ←M2
                                             (TUPLE $T $$CDR))
                                    (QASSERT (TUPLE LIST $L $M2))
                                    (QMATCHQ
                                      ←PGM
                                      (TUPLE (TUPLE COMMENT WE JUST 
                                                    TOOK THE NEW CELL 
                                                    $T
                                                AND CONSED IT ONTO $L 
                                                    SINCE $CAR ALREADY 
                                                    BELONGS
                                                TO ANOTHER LIST 
                                                   STRUCTURE NAMELY $M)
                                             (TUPLE SETQ $T $CAR)
                                             (TUPLE SETQ L
                                                    (TUPLE CONS $T $L))
                                             $$PGM))
                                    (QATTEMPT (QEXISTS (TUPLE C $CAR 
                                                              ←M2))
                                        THEN (QASSERT (TUPLE C $T $M2]
                      ELSE (QPROG (←TEMP)
                                  (QDELETE (TUPLE LIST $L $CDR))
                                  (QMATCHQ ←TEMP
                                           (TUPLE $CAR $$CDR))
                                  (QASSERT (TUPLE LIST $L $TEMP))
                                  (QMATCHQ ←PGM
                                           (TUPLE (TUPLE COMMENT WE 
                                                         JUST TOOK $CAR
                                                     AND CONSED IT ONTO 
                                                         LIST $L)
                                                  (TUPLE SETQ $L
                                                         (TUPLE CONS 
                                                               $CAR $L))
                                                  $$PGM])

(SETQC
  [QLAMBDA (TUPLE C ←NEWLOC
                  ←NEWVAL)
           (QPROG (←OLDLOC
                    ←LOC2
                    ←V)
                  (QATTEMPT (QEXISTS (TUPLE C $NEWLOC ←V)
                                     REQUIRED TRUE)
                      THEN (QFAIL QPROG))
                  (QEXISTS (TUPLE C ←OLDLOC
                                  $NEWVAL))
                  (QATTEMPT (QEXISTS (TUPLE C ←LOC2
                                            $NEWVAL)
                                     NEEDED TRUE)
                    ELSE (QPUT (TUPLE C $OLDLOC $NEWVAL)
                               NEEDED TRUE))
                  (QEXISTS (TUPLE C ←OLDLOC
                                  $NEWVAL)
                           NEEDED TRUE)
                  (STORECVALUE $NEWLOC)
                  (BUILDPGM (TUPLE $NEWLOC $NEWVAL $OLDLOC))
                  (QDELETE (TUPLE C $NEWLOC ←V))
                  (QASSERT (TUPLE C $NEWLOC $NEWVAL])

(TRANSITIVECLOSURE
  [QLAMBDA (TUPLE ←RELN
                  ←A
                  ←B)
           (QIF (QEQUAL (QGET (TUPLE $RELN TRANSITIVE))
                        TRUE)
             ELSE (QFAIL))
           (QBEXISTS (TUPLE $RELN $A ←ANY)
               THEN (QIF (QEQUAL $ANY $B)
                        THEN (QASSERT (TUPLE $RELN $A $B))
                      ELSE (TRANSITIVECLOSURE (TUPLE $RELN $ANY $B])

(TRYANYTHINGANTISYMPARTIAL
  (QLAMBDA (TUPLE ←TYPE
                  ←←STUFF
                  (TUPLE ←RELN
                         ←A
                         ←B)←←STUFF2)
           (QIF (QAND (QGET $RELN ANTISYM)
                      (QGET $RELN PARTIAL))
             ELSE (QFAIL))
           (QIF (QOR (QATTEMPT (QEXISTS (TUPLE $RELN $A $B))
                         THEN (QNOTEQUAL (QGET (TUPLE $RELN $A $B)
                                               TEMP)
                                         TRUE))
                     (QATTEMPT (QEXISTS (TUPLE $RELN $B $A))
                         THEN (QNOTEQUAL (QGET (TUPLE $RELN $B $A)
                                               TEMP)
                                         TRUE)))
               THEN (QFAIL))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT IF $A $RELN $B
                               THEN)
                           (TUPLE COND (TUPLE $RELN $A $B))
                           $$PGM))
           (QASSERT (TUPLE $RELN $A $B))
           (QPUT (TUPLE $RELN $A $B)
                 TEMP TRUE)
           (QATTEMPT (QGOAL (TUPLE $TYPE $$STUFF (TUPLE $RELN $A $B)
                                   $$STUFF2)
                            APPLY $GOALTYPE)
             ELSE (QMATCHQ ←PGM
                           (TUPLE (TUPLE PRINT GIVEUP)
                                  $$PGM)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT END OF THE
                               THEN PART OF THE COND
                                    AND THUS BEGIN THE
                             ELSE PART OF THE COND)
                           (TUPLE (TUPLE T))
                           $$PGM))
           (QDELETE (TUPLE $RELN $A $B))
           (QASSERT (TUPLE $RELN $B $A))
           (QPUT (TUPLE $RELN $B $A)
                 TEMP TRUE)
           (QATTEMPT (QGOAL (TUPLE $TYPE $$STUFF (TUPLE $RELN $A $B)
                                   $$STUFF2)
                            APPLY $GOALTYPE)
             ELSE (QMATCHQ ←PGM
                           (TUPLE (TUPLE PRINT GIVEUP)
                                  $$PGM)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT END OF COND EXPRESSION)
                           $$PGM))
           (QDELETE (TUPLE $RELN $B $A))
           BACKTRACK))

(SIMPLEGOAL
  [QLAMBDA ←ANYTHING
           (QGOAL $ANYTHING APPLY $DO)
           (COND
             (REQUIRE (QPUT $ANYTHING REQUIRED TRUE])

(SOLVE
  [QLAMBDA ←PROBLEM
           (QGOAL $PROBLEM APPLY $GOALTYPE)
           (QMATCHQ ←PGM
                    (QREVERSE $PGM))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT BEGINNING OF PROGRAM)
                           $$PGM
                           (TUPLE COMMENT END OF PROGRAM])

(SETUP
  (QLAMBDA ←ANYTHING
           (DENYALL)
           (QASSERT (TUPLE C A A3))
           (QASSERT (TUPLE C B B3))
           (QASSERT (TUPLE C C C3))
           (QASSERT (TUPLE C D D3))
           (QASSERT (TUPLE C E E3))
           (QASSERT (TUPLE C F F3))
           (QASSERT (TUPLE C G G3))
           (QASSERT (TUPLE C I I3))
           (QASSERT (TUPLE C J J3))
           (QASSERT (TUPLE C K K3))
           (QASSERT (TUPLE C H H3))
           (QASSERT (TUPLE LIST L1 (TUPLE)))
           (QASSERT (TUPLE LIST L2 (TUPLE)))
           (QASSERT (TUPLE LIST L3 (TUPLE)))
           (QASSERT (TUPLE LIST L4 (TUPLE A B C)))
           (QASSERT (TUPLE LIST L5 (TUPLE D E)))
           (QASSERT (TUPLE LESS I J))
           (QASSERT (TUPLE LESS J K))
           (QASSERT (TUPLE LESS H I))
           (QPUT LESS ANTISYM TRUE)
           (QPUT LESS PARTIAL TRUE)
           (QPUT LESS TRANSITIVE TRUE)
           (TUPLE SETUP COMPLETED)))

(INIT
  (QLAMBDA ←ANYTHING
           (QMATCHQ ←GOALTYPE
                    (TUPLE ORGOAL ANDGOAL XORGOAL SERIESGOAL SIMPLEGOAL 
                           TRYANYTHINGANTISYMPARTIAL))
           (QMATCHQ ←DO
                    (TUPLE SETQC RPLAC CONSC MAKENULL TRANSITIVECLOSURE 
                           REV2ELS))
           (QMATCHQ ←PGM
                    (TUPLE))
           (QMATCHQ ←UNUSEDVARS
                    (CLASS U1 U2 U3 U4 U5 U6 U7 U8 U9 U10 U11 U12 U13 
                           U14 U15 U16 U17))
           (QMATCHQ ←UNUSEDV
                    $UNUSEDVARS)
           $ANYTHING))

(GETNEWLOCNAME
  (QLAMBDA ←ANYTHING
           (QPROG (←X)
                  (QMATCHQ (CLASS ←X
                                  ←←UNUSEDVARS)
                           $UNUSEDVARS)
                  (QRETURN $X))))

(DENYALL
  [QLAMBDA ←ANYTHING
           (QATTEMPT (QDELETE (TUPLE C ←C1
                                     ←V1)))
           [QATTEMPT (QDELETE (TUPLE LIST ←L1
                                     (TUPLE ←←V1]
           (QATTEMPT (QDELETE (TUPLE LESS ←C1
                                     ←V1])

(SERIESGOAL
  (QLAMBDA (TUPLE SERIES ←Z1
                  ←←Z2)
           (SETQ NEED NIL)
           (SETQ REQUIRE NIL)
           (QGOAL $Z1 APPLY $GOALTYPE)
           (QIF (QEQUAL $Z2 (TUPLE))
               THEN $PGM
             ELSE (QGOAL (TUPLE SERIES $$Z2)
                         APPLY $GOALTYPE))))

(ORGOAL
  (QLAMBDA (CLASS OR ←Z1
                     ←←Z2)
           (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
               THEN (QMATCHQ ←PGM
                             (TUPLE (TUPLE COMMENT
                                       FROM THE ORTASK WE SHALL
                                       DO $Z1)
                                    $$PGM))
             ELSE (QGOAL (CLASS OR $$Z2)
                         APPLY $GOALTYPE))))

(ANDGOAL
  [QLAMBDA (CLASS AND ←←Z)
           (QPROG (←Z1
                    ←Z2
                    ←Z3)
                  (QMATCHQ ←Z3
                           (CLASS))
                  B1
                  (QMATCHQ (CLASS ←Z1
                                  ←←Z2)
                           $Z)
                  (QMATCHQ ←Z3
                           (CLASS $$Z3 $Z1))
                  (QMATCHQ ←Z
                           (CLASS $$Z2))
                  (SETQ NEED T)
                  (SETQ REQUIRE T)
                  (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
                      THEN (QIF (QEQUAL $Z2 (CLASS))
                               THEN (QIF (QEQUAL $Z3 (CLASS))
                                        THEN $PGM
                                      ELSE (QGOAL (CLASS AND $$Z3)
                                                  APPLY $GOALTYPE))
                             ELSE (QGOAL (CLASS AND $$Z2)
                                         APPLY $GOALTYPE))
                    ELSE (GO B1])

(XORGOAL
  (QLAMBDA (CLASS XOR ←Z1
                  ←←Z2)
           (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
               THEN (QATTEMPT (QGOAL (CLASS NONEOF $$Z2)
                                     APPLY $GOALTYPE)
                        THEN (QMATCHQ ←PGM
                                      (TUPLE (TUPLE COMMENT OF THE 
                                                    EXCLUSIVE
                                                OR GOAL WE DID $Z1
                                                AND NO OTHERS ARE 
                                                    SATISFIED)
                                             $$PGM)))
             ELSE (QGOAL (CLASS XOR $$Z2)
                         APPLY $GOALTYPE))))

(BUILDPGM
  (QLAMBDA (TUPLE ←NEWLOC
                  ←NEWVAL
                  ←OLDLOC)
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT I JUST TRANSFERRED THE VALUE 
                                  $NEWVAL FROM CELL $OLDLOC
                              TO CELL $NEWLOC)
                           (TUPLE SETQ $NEWLOC $OLDLOC)
                           $$PGM))))
)
  (QSETUP PUPVARS)
STOP